package cn.openea.perpartner.mpwx.util;

import cn.hutool.core.util.HexUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import cn.openea.perpartner.common.core.utils.DateUtils;
import cn.openea.perpartner.common.core.utils.ServletUtils;

import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
 * @author Weird077
 * @description TODO
 * @date 2022-08-08 11:45
 */
public class WeChatUtil {
    /**
     * 获得微信post过来的数据内容
     */
    public static String getWeiXinXml() throws Exception {
        InputStream is = ServletUtils.getRequest().getInputStream();
        // 取HTTP请求流长度
        int size = ServletUtils.getRequest().getContentLength();
        // 用于缓存每次读取的数据
        byte[] buffer = new byte[size];
        // 用于存放结果的数组
        byte[] xmldataByte = new byte[size];
        int count = 0;
        int rbyte = 0;
        // 循环读取
        while (count < size) {
            // 每次实际读取长度存于rbyte中
            rbyte = is.read(buffer);
            for (int i = 0; i < rbyte; i++) {
                xmldataByte[count + i] = buffer[i];
            }
            count += rbyte;
        }
        is.close();
        return new String(xmldataByte, "UTF-8");
    }
    /**
     * 用字符串方法从微信发送来的xml数据中分析数据内容
     */
    public static String getXmlValue(String xmlStr, String fieldName) {
        String startCode = "<" + fieldName + ">";
        String endCode = "</" + fieldName + ">";
        String valueStr = "";
        int spos = xmlStr.indexOf(startCode);
        int epos = xmlStr.indexOf(endCode);
        if (spos != -1) {
            valueStr = xmlStr.substring(spos + startCode.length(), epos);
            if (valueStr.startsWith("<![CDATA[")) {
                valueStr = valueStr.substring(9, valueStr.length() - 3);
            }
        }
        return valueStr;
    }
    /**
     * 发送文本消息
     * @param fromUserName 接收者，对服务器来说一般是公众号注册者
     * @param toUserName 操作者
     * @param msg 需要发送的消息内容
     */
    public static String sendTextMsg(String fromUserName, String toUserName, String msg) {
        return  "<xml>"
                + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"
                + "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"
                + "<CreateTime>" + DateUtils.getNow() + "</CreateTime>"
                + "<MsgType><![CDATA[text]]></MsgType>"
                + "<Content><![CDATA[" + msg + "]]></Content>"
                + "<FuncFlag>0</FuncFlag>"
                + "</xml>";
    }
    /**
     * 发送图片消息
     * @param fromUserName 接收者，对服务器来说一般是公众号注册者
     * @param toUserName 操作者
     * @param media_id 通过素材管理中的接口上传多媒体文件，得到的id
     */
    public static String sendImageMsg(String fromUserName, String toUserName, String media_id) {
        return "<xml>"
                + "<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>"
                + "<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>"
                + "<CreateTime>" + DateUtils.getNow() + "</CreateTime>"
                + "<MsgType><![CDATA[image]]></MsgType>"
                + "<Image>"
                + "<MediaId><![CDATA[" + media_id + "]]></MediaId>"
                + "</Image>"
                + "</xml>";
    }
    /**
     * 3、验证消息的合法性
     *  （1）将token、timestamp、nonce三个参数进行字典序排序
     *  （2）将三个参数字符串拼接成一个字符串进行sha1加密
     *  （3）开发者获得加密后的字符串可与signature对比，标识该请求来源于微信
     *  参考于：https://blog.csdn.net/hua1017177499/article/details/79047697
     *   @param signature 微信加密签名，signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
     *   @param timestamp 时间戳
     *   @param nonce 随机数
     *   @return true表示消息是从微信发送过来的，不是模拟的
     */
    public static  boolean checkSignature(String signature, String timestamp, String nonce,String sToken) {
        String token = sToken;
        // 对token、timestamp、和nonce按字典排序.
        String[] paramArr = new String[] {token, timestamp, nonce};
        Arrays.sort(paramArr);
        // 将排序后的结果拼接成一个字符串.
        String content  = paramArr[0].concat(paramArr[1]).concat(paramArr[2]);
        String ciphertext = null;
        try {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            // 对拼接后的字符串进行sha1加密.
            byte[] digest = md.digest(content.toString().getBytes());
            ciphertext = HexUtil.encodeHexStr(digest);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        // 将sha1加密后的字符串与signature进行对比.
        return ciphertext != null && ciphertext.equals(signature.toLowerCase());
    }

    /**
     * 获取App跳转路径JSON
     * @param appid 所需跳转到的小程序appid（该小程序appid必须与发模板消息的公众号是绑定关联关系，暂不支持小游戏）
     * @param pagepath 所需跳转到小程序的具体页面路径，支持带参数,（示例index?foo=bar），要求该小程序已发布，暂不支持小游戏
     * @return
     */
    public static JSONObject getMiniAppObj(String appid, String pagepath) {
        JSONObject miniappdata = new JSONObject();
        miniappdata.put("appid", appid);
        miniappdata.put("pagepath", pagepath);
        return miniappdata;
    }

    public static JSONObject getDataJSON(String value, String color) {
        if(StrUtil.isBlank(color)){
            color = "#173177";
        }
        JSONObject object = new JSONObject();
        object.put("value", value);
        object.put("color", color);
        return object;
    }
}
